<?

class ip extends Think {
	
	static function address() {
		return $_SERVER ['REMOTE_ADDR'];
	}
	
	static function ipfrom($ip) {
		if (! preg_match ( "/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip )) {
			return '';
		}
		
		if ($fd = fopen ( RP . 'ipdata/QQWry.Dat', 'rb' )) {
			
			$ip = explode ( '.', $ip );
			$ipNum = $ip [0] * 16777216 + $ip [1] * 65536 + $ip [2] * 256 + $ip [3];
			
			$DataBegin = fread ( $fd, 4 );
			$DataEnd = fread ( $fd, 4 );
			$ipbegin = implode ( '', unpack ( 'L', $DataBegin ) );
			if ($ipbegin < 0)
				$ipbegin += pow ( 2, 32 );
			$ipend = implode ( '', unpack ( 'L', $DataEnd ) );
			if ($ipend < 0)
				$ipend += pow ( 2, 32 );
			$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
			
			$BeginNum = 0;
			$EndNum = $ipAllNum;
			
			while ( $ip1num > $ipNum || $ip2num < $ipNum ) {
				$Middle = intval ( ($EndNum + $BeginNum) / 2 );
				
				fseek ( $fd, $ipbegin + 7 * $Middle );
				$ipData1 = fread ( $fd, 4 );
				if (strlen ( $ipData1 ) < 4) {
					fclose ( $fd );
					return '- System Error';
				}
				$ip1num = implode ( '', unpack ( 'L', $ipData1 ) );
				if ($ip1num < 0)
					$ip1num += pow ( 2, 32 );
				
				if ($ip1num > $ipNum) {
					$EndNum = $Middle;
					continue;
				}
				
				$DataSeek = fread ( $fd, 3 );
				if (strlen ( $DataSeek ) < 3) {
					fclose ( $fd );
					return '- System Error';
				}
				$DataSeek = implode ( '', unpack ( 'L', $DataSeek . chr ( 0 ) ) );
				fseek ( $fd, $DataSeek );
				$ipData2 = fread ( $fd, 4 );
				if (strlen ( $ipData2 ) < 4) {
					fclose ( $fd );
					return '- System Error';
				}
				$ip2num = implode ( '', unpack ( 'L', $ipData2 ) );
				if ($ip2num < 0)
					$ip2num += pow ( 2, 32 );
				
				if ($ip2num < $ipNum) {
					if ($Middle == $BeginNum) {
						fclose ( $fd );
						return '- Unknown';
					}
					$BeginNum = $Middle;
				}
			}
			
			$ipFlag = fread ( $fd, 1 );
			if ($ipFlag == chr ( 1 )) {
				$ipSeek = fread ( $fd, 3 );
				if (strlen ( $ipSeek ) < 3) {
					fclose ( $fd );
					return '- System Error';
				}
				$ipSeek = implode ( '', unpack ( 'L', $ipSeek . chr ( 0 ) ) );
				fseek ( $fd, $ipSeek );
				$ipFlag = fread ( $fd, 1 );
			}
			
			if ($ipFlag == chr ( 2 )) {
				$AddrSeek = fread ( $fd, 3 );
				if (strlen ( $AddrSeek ) < 3) {
					fclose ( $fd );
					return '- System Error';
				}
				$ipFlag = fread ( $fd, 1 );
				if ($ipFlag == chr ( 2 )) {
					$AddrSeek2 = fread ( $fd, 3 );
					if (strlen ( $AddrSeek2 ) < 3) {
						fclose ( $fd );
						return '- System Error';
					}
					$AddrSeek2 = implode ( '', unpack ( 'L', $AddrSeek2 . chr ( 0 ) ) );
					fseek ( $fd, $AddrSeek2 );
				} else {
					fseek ( $fd, - 1, SEEK_CUR );
				}
				
				while ( ($char = fread ( $fd, 1 )) != chr ( 0 ) )
					$ipAddr2 .= $char;
				
				$AddrSeek = implode ( '', unpack ( 'L', $AddrSeek . chr ( 0 ) ) );
				fseek ( $fd, $AddrSeek );
				
				while ( ($char = fread ( $fd, 1 )) != chr ( 0 ) )
					$ipAddr1 .= $char;
			} else {
				fseek ( $fd, - 1, SEEK_CUR );
				while ( ($char = fread ( $fd, 1 )) != chr ( 0 ) )
					$ipAddr1 .= $char;
				
				$ipFlag = fread ( $fd, 1 );
				if ($ipFlag == chr ( 2 )) {
					$AddrSeek2 = fread ( $fd, 3 );
					if (strlen ( $AddrSeek2 ) < 3) {
						fclose ( $fd );
						return '- System Error';
					}
					$AddrSeek2 = implode ( '', unpack ( 'L', $AddrSeek2 . chr ( 0 ) ) );
					fseek ( $fd, $AddrSeek2 );
				} else {
					fseek ( $fd, - 1, SEEK_CUR );
				}
				while ( ($char = fread ( $fd, 1 )) != chr ( 0 ) )
					$ipAddr2 .= $char;
			}
			fclose ( $fd );
			
			if (preg_match ( '/http/i', $ipAddr2 )) {
				$ipAddr2 = '';
			}
			$ipaddr = "$ipAddr1 $ipAddr2";
			$ipaddr = preg_replace ( '/CZ88\.NET/is', '', $ipaddr );
			$ipaddr = preg_replace ( '/^\s*/is', '', $ipaddr );
			$ipaddr = preg_replace ( '/\s*$/is', '', $ipaddr );
			if (preg_match ( '/http/i', $ipaddr ) || $ipaddr == '') {
				$ipaddr = '- Unknown';
			}
			
			return iconv ( 'gbk', 'utf-8', $ipaddr );
		
		} else {
			
			$datadir = 'ipdata/';
			$ip_detail = explode ( '.', $ip );
			if (file_exists ( $datadir . $ip_detail [0] . '.txt' )) {
				$ip_fdata = @fopen ( $datadir . $ip_detail [0] . '.txt', 'r' );
			} else {
				if (! ($ip_fdata = @fopen ( $datadir . '0.txt', 'r' ))) {
					return '- Invalid IP data file';
				}
			}
			for($i = 0; $i <= 3; $i ++) {
				$ip_detail [$i] = sprintf ( '%03d', $ip_detail [$i] );
			}
			$ip = join ( '.', $ip_detail );
			do {
				$ip_data = fgets ( $ip_fdata, 200 );
				$ip_data_detail = explode ( '|', $ip_data );
				if ($ip >= $ip_data_detail [0] && $ip <= $ip_data_detail [1]) {
					fclose ( $ip_fdata );
					return '- ' . $ip_data_detail [2] . $ip_data_detail [3];
				}
			} while ( ! feof ( $ip_fdata ) );
			fclose ( $ip_fdata );
			return '- UNKNOWN';
		}
	}
	
	static function ecip($str) {
		
		if (! ereg ( "国", $str ) && ! ereg ( "省", $str ) && ! ereg ( "市", $str )) { //乜都冇
			$t = explode ( " ", $str );
			return $t [0];
		} elseif (ereg ( "国", $str ) && ! ereg ( "省", $str ) && ! ereg ( "市", $str )) { //有国
			$t = explode ( "国", $str );
			return $t [0] . "国";
		} elseif (ereg ( "北京", $str ) || ereg ( "上海", $str ) || ereg ( "天津", $str ) || ereg ( "重庆", $str )) { //直辖市
			if (ereg ( "区", $str )) { //有区
				$t = explode ( "区", $str );
				return $t [0] . "区";
			} else {
				$t = explode ( "市", $str );
				return $t [0];
			}
		} elseif (ereg ( "省", $str ) && ereg ( "市", $str )) { //有省有市
			$t = explode ( "市", $str );
			return $t [0] . "市";
		} elseif (! ereg ( "省", $str ) && ereg ( "市", $str )) { //有市冇省
			$t = explode ( "市", $str );
			return $t [0] . "市";
		} elseif (ereg ( "省", $str ) && ! ereg ( "市", $str )) { //有省冇市
			$t = explode ( "省", $str );
			return $t [0] . "省";
		}
	}
	
	static function getP($str) {
		
		if (ereg ( "北京", $str ) || ereg ( "上海", $str ) || ereg ( "天津", $str ) || ereg ( "重庆", $str )) { //直辖市
			$t = explode ( "市", $str );
			return $t [0];
		} elseif (ereg ( "省", $str )) {
			$t = explode ( "省", $str );
			return $t [0];
		} else {
			return '';
		}
	}
	
	static function getC($str) {
		
		if (ereg ( "北京", $str ) || ereg ( "上海", $str ) || ereg ( "天津", $str ) || ereg ( "重庆", $str )) { //直辖市
			

			$t = explode ( "市", $str );
			if (ereg ( "区", $t [1] )) { //有区
				$t = explode ( "区", $t [1] );
				return $t [0];
			} else {
				return '';
			}
		} elseif (ereg ( "省", $str ) && ereg ( "市", $str )) {
			$t = explode ( "省", $str );
			$t = explode ( "市", $t [1] );
			return $t [0];
		} else {
			return '';
		}
	}
}
?>